
// 声明了一个getName函数
function getName() { console.log (5);}  //会提升到上面，这个方法会被覆盖
// 定义了一个Foo构造函数，
function Foo() {
    getName = function () { console.log(1);}; //全局变量会覆盖外层的getName函数表达式
    return this;
}
// 静态属性存储了一个匿名函数
Foo.getName = function () { console.log (2);};
// 在原型上创建了一个getName的匿名函数
Foo.prototype.getName = function () { console.log (3);};
// 函数表达式创建了一个getName的函数
// var getName = function () { console.log (4);};
var getName = function () { console.log(1);};
 

Foo().getName(); //1
// this指向window调用的getName并返回。Foo的getName覆盖掉外面的getName函数表达式并赋值
getName();//1
// .点 成员访问 和new (带参数列表)同级 >new (无参数列表)
new Foo.getName();// new (Foo.getName)()  2
// new有参数列表(18)->.成员访问(18)->()函数调用(17)
new Foo().getName(); //（new Foo()）.getName()
// new Foo() 公有方法=》原型上的getName方法  3

new new Foo().getName();
// new (new Foo()).getName();
// (new Foo()).getName() => 作为构造函数  3


// 注意：公有方法大于原型上的公有方法  可看题2扩展